babl_lookup (BablLookup *lookup,
float number)
{
- union { float f; uint32_t i; } u;
- union { float f; uint32_t i; } ua;
- union { float f; uint32_t i; } ub;
+ union { float f; uint32_t i; } u;
+ union { float f; uint32_t i; } ub;
+ union { float f; uint32_t i; } ua;
+
uint32_t i;
+ float dx = 0.0;
u.f = number;
i = (u.i << LSHIFT ) >> lookup->shift;
if (i > lookup->positive_min && i < lookup->positive_max)
{
- ua.i = ((i ) << lookup->shift) >> LSHIFT;
+ ua.i = ((i) << lookup->shift) >> LSHIFT;
ub.i = ((i+ 1) << lookup->shift) >> LSHIFT;
i = i - lookup->positive_min;
return lookup->function (number, lookup->data);
}
- ua.i |= 0b11110000000000000000000000000000;
+ {
+ uint32_t bm =u.i & 0b11110000000000000000000000000000;
+ ua.i |= bm;
+ ub.i |= bm;
+ }
+ dx = (u.f-ua.f) / (ub.f - ua.f);
+
+ {
if (!(lookup->bitmask[i/32] & (1UL<<(i & 31))))
{
lookup->table[i]= lookup->function (ua.f, lookup->data);
lookup->bitmask[i/32] |= (1UL<<(i & 31));
}
-
- if (i< lookup->entries-1)
+ i++;
+ if (i< lookup->entries-2)
{
- float dx;
-
- ub.i |= 0b11110000000000000000000000000000;
- dx = (u.f-ua.f) / (ub.f - ua.f);
-
- i++;
if (!(lookup->bitmask[i/32] & (1UL<<(i & 31))))
{
lookup->table[i]= lookup->function (ub.f, lookup->data);
}
else
{
- return lookup->table[i];
+ return lookup->table[i-1];
+ }
}
}
else if (precision <= 0.000649) shift = 15;
else shift = 16; /* a bit better than 8bit sRGB quality */
- shift = 17; /* hard-coded decrease to slow down and increase precision,
- increase to speed up and decease precision */
+ shift = 16;
/* Adjust slightly away from 0.0, saving many entries close to 0, this
* causes lookups very close to zero to be passed directly to the
positive_max-=diff;
}
- lookup = calloc (sizeof (BablLookup) +
- sizeof (float) * ((positive_max-positive_min)+
- (negative_max-negative_min)), 1);
+ lookup = calloc (sizeof (BablLookup) + sizeof (float) *
+ ((positive_max-positive_min)+
+ (negative_max-negative_min)), 1);
lookup->positive_min = positive_min;
lookup->positive_max = positive_max;
unsigned char *dst,
long samples)
{
- float *fsrc = (float *) src;
+ float *fsrc = (float *) src;
uint8_t *cdst = (uint8_t *) dst;
int n = samples;
{
int val = linear_to_gamma_2_2_lut (red) * 0xff + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (green) * 0xff + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (blue) * 0xff + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
*cdst++ = 0xff;
}
else if (alpha <= 0.0)
else
{
float balpha = alpha * 0xff;
-
int val = linear_to_gamma_2_2_lut (red) * balpha + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (green) * balpha + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (blue) * balpha + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
*cdst++ = balpha + 0.5f;
}
}
{
int val = linear_to_gamma_2_2_lut (blue) * 0xff + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (green) * 0xff + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (red) * 0xff + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
*cdst++ = 0xff;
}
else if (alpha <= 0.0)
else
{
float balpha = alpha * 0xff;
-
int val = linear_to_gamma_2_2_lut (blue) * balpha + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (green) * balpha + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
val = linear_to_gamma_2_2_lut (red) * balpha + 0.5f;
*cdst++ = val >= 0xff ? 0xff : val <= 0 ? 0 : val;
-
*cdst++ = balpha + 0.5f;
}
}
f = 2;
}
+
+
{
const Babl *f32 = babl_format_new (
"name", "cairo-ARGB32",
free (fast_rpow);
free (fast_pow);
}
+